LÄs upp avancerade CSS-funktioner med @property, en kraftfull funktion för att registrera och anpassa CSS-egenskaper. LÀr dig hur du utnyttjar den för förbÀttrad styling och animeringskontroll.
BemÀstra CSS: Anpassad Egenskapsregistrering med @property
Anpassade egenskaper (Àven kÀnda som CSS-variabler) har revolutionerat hur vi skriver och underhÄller CSS. De tillÄter oss att definiera ÄteranvÀndbara vÀrden, vilket gör vÄra stilmallar mer flexibla och underhÄllbara. Men vad hÀnder om du kan gÄ utöver att bara definiera vÀrden? Vad hÀnder om du kan definiera typen av vÀrde som en anpassad egenskap innehÄller, tillsammans med dess initiala vÀrde och arvsbeteende? Det Àr dÀr @property kommer in.
Vad Àr @property?
@property Àr en CSS at-regel som lÄter dig uttryckligen registrera en anpassad egenskap hos webblÀsaren. Denna registreringsprocess ger webblÀsaren information om egenskapens förvÀntade typ, dess initiala vÀrde och om den ska Àrvas frÄn dess överordnade element. Detta lÄser upp flera avancerade funktioner, inklusive:
- Typkontroll: SÀkerstÀller att den anpassade egenskapen tilldelas ett vÀrde av rÀtt typ.
- Animering: Möjliggör smidiga övergÄngar och animeringar för anpassade egenskaper av specifika typer, som siffror eller fÀrger.
- StandardvÀrden: Ger ett reservvÀrde om den anpassade egenskapen inte Àr uttryckligen definierad.
- Arvskontroll: BestÀmmer om den anpassade egenskapen Àrver sitt vÀrde frÄn dess överordnade element.
TÀnk pÄ det som att lÀgga till typsÀkerhet till dina CSS-variabler. Det lÄter dig skapa mer robusta och förutsÀgbara stilmallar.
Syntaxen för @property
@property-regeln följer denna grundlÀggande syntax:
@property --egenskapsnamn {
syntax: '';
inherits: true | false;
initial-value: ;
}
LÄt oss bryta ner varje del:
--egenskapsnamn: Namnet pÄ den anpassade egenskapen du vill registrera. Den mÄste börja med tvÄ bindestreck (--).syntax: Definierar den förvÀntade typen av vÀrde för egenskapen. Detta Àr avgörande för typkontroll och animering. Vi kommer att utforska de tillgÀngliga syntaxvÀrdena i detalj nedan.inherits: Ett booleskt vÀrde som indikerar om egenskapen ska Àrvas frÄn dess överordnade element. StandardvÀrdet Àrfalseom det inte anges.initial-value: StandardvÀrdet för egenskapen om det inte Àr uttryckligen instÀllt pÄ ett element. Detta sÀkerstÀller att ett reservvÀrde alltid Àr tillgÀngligt.
FörstÄ syntax-deskriptorn
syntax-deskriptorn Àr den viktigaste delen av @property-regeln. Den talar om för webblÀsaren vilken typ av vÀrde som förvÀntas för den anpassade egenskapen. HÀr Àr nÄgra vanliga syntaxvÀrden:
*: TillÄter vilket vÀrde som helst. Detta Àr den mest tillÄtande syntaxen och replikerar i huvudsak beteendet hos en vanlig CSS-variabel utan registrering. AnvÀnd detta sparsamt.<length>: FörvÀntar sig ett lÀngdvÀrde (t.ex.10px,2em,50%). Detta möjliggör smidiga animeringar mellan olika lÀngdvÀrden.<number>: FörvÀntar sig ett numeriskt vÀrde (t.ex.1,3.14,-5). AnvÀndbart för att animera numeriska egenskaper som opacitet eller skala.<percentage>: FörvÀntar sig ett procentvÀrde (t.ex.25%,100%).<color>: FörvÀntar sig ett fÀrgvÀrde (t.ex.#f00,rgb(255, 0, 0),hsl(0, 100%, 50%)). Möjliggör smidiga fÀrgövergÄngar och animeringar.<image>: FörvÀntar sig ett bildvÀrde (t.ex.url(image.jpg),linear-gradient(...)).<integer>: FörvÀntar sig ett heltal (t.ex.1,-10,0).<angle>: FörvÀntar sig ett vinkelvÀrde (t.ex.45deg,0.5rad,200grad). AnvÀndbart för att animera rotationer.<time>: FörvÀntar sig ett tidsvÀrde (t.ex.1s,500ms). AnvÀndbart för att kontrollera animeringslÀngder eller fördröjningar via anpassade egenskaper.<resolution>: FörvÀntar sig ett upplösningsvÀrde (t.ex.300dpi,96dpi).<transform-list>: FörvÀntar sig en lista med transformationsfunktioner (t.ex.translateX(10px) rotate(45deg)). TillÄter animering av komplexa transformationer.<custom-ident>: FörvÀntar sig en anpassad identifierare (en strÀng). Liknar enenum.<string>: FörvÀntar sig ett strÀngvÀrde (t.ex."Hello World"). Var försiktig med detta, eftersom animering av strÀngar i allmÀnhet inte stöds.- Anpassade syntaxer: Du kan skapa mer komplexa syntaxer med hjÀlp av kombinationer av ovanstÄende och operatorerna
|(eller), `[]` (gruppering), `+` (en eller flera), `*` (noll eller flera) och `?` (noll eller en). Till exempel:<length> | <percentage>tillÄter antingen en lÀngd eller ett procentvÀrde.
Att vÀlja rÀtt syntax Àr avgörande för att utnyttja den fulla kraften i @property.
Praktiska exempel pÄ @property
LÄt oss titta pÄ nÄgra praktiska exempel pÄ hur du anvÀnder @property i din CSS.
Exempel 1: Animera en bakgrundsfÀrg
Anta att du vill animera bakgrundsfÀrgen pÄ en knapp. Du kan anvÀnda @property för att registrera en anpassad egenskap för bakgrundsfÀrgen och sedan animera den med CSS-övergÄngar.
@property --bg-color {
syntax: '<color>';
inherits: false;
initial-value: #fff;
}
.button {
background-color: var(--bg-color);
transition: --bg-color 0.3s ease;
}
.button:hover {
--bg-color: #f00; /* Röd */
}
I det hÀr exemplet registrerar vi den anpassade egenskapen --bg-color med <color>-syntaxen, vilket innebÀr att den förvÀntar sig ett fÀrgvÀrde. initial-value Àr instÀllt pÄ vitt (#fff). NÀr musen hovrar över knappen Àndras --bg-color till rött (#f00), och övergÄngen animerar smidigt bakgrundsfÀrgsÀndringen.
Exempel 2: Kontrollera kantradie med ett nummer
Du kan anvÀnda @property för att kontrollera kantradien för ett element och animera den.
@property --border-radius {
syntax: '<length>';
inherits: false;
initial-value: 0px;
}
.rounded-box {
border-radius: var(--border-radius);
transition: --border-radius 0.5s ease;
}
.rounded-box:hover {
--border-radius: 20px;
}
HÀr registrerar vi --border-radius som en <length>, vilket sÀkerstÀller att den accepterar lÀngdvÀrden som px, em eller %. Det initiala vÀrdet Àr 0px. NÀr du hovrar över .rounded-box animeras kantradien till 20px.
Exempel 3: Animera en skuggförskjutning
LÄt oss sÀga att du vill animera den horisontella förskjutningen av en boxskugga.
@property --shadow-offset-x {
syntax: '<length>';
inherits: false;
initial-value: 0px;
}
.shadowed-box {
box-shadow: var(--shadow-offset-x) 5px 10px rgba(0, 0, 0, 0.5);
transition: --shadow-offset-x 0.3s ease;
}
.shadowed-box:hover {
--shadow-offset-x: 10px;
}
I det hÀr fallet registreras --shadow-offset-x som en <length>, och dess initiala vÀrde Àr 0px. Egenskapen box-shadow anvÀnder denna anpassade egenskap för sin horisontella förskjutning. Vid hovring animeras förskjutningen till 10px.
Exempel 4: AnvÀnda <custom-ident> för teman
Syntaxen <custom-ident> lÄter dig definiera en uppsÀttning fördefinierade strÀngvÀrden, vilket effektivt skapar en enum för dina CSS-variabler. Detta Àr anvÀndbart för teman eller för att kontrollera distinkta tillstÄnd.
@property --theme {
syntax: '<custom-ident>';
inherits: true;
initial-value: light;
}
:root {
--theme: light; /* Standardtema */
}
body {
background-color: var(--theme) == light ? #fff : #333;
color: var(--theme) == light ? #000 : #fff;
}
.dark-theme {
--theme: dark;
}
HĂ€r registreras --theme med <custom-ident>-syntaxen. Ăven om vi inte uttryckligen listar de tillĂ„tna identifierarna i sjĂ€lva @property-regeln, antyder koden att de Ă€r `light` och `dark`. CSS:en anvĂ€nder sedan villkorslogik (var(--theme) == light ? ... : ...) för att tillĂ€mpa olika stilar baserat pĂ„ det aktuella temat. Att lĂ€gga till klassen `dark-theme` till ett element vĂ€xlar temat till mörkt. Observera att villkorslogik med `var()` inte Ă€r standard-CSS och ofta krĂ€ver preprocessors eller JavaScript. En mer standardmetod skulle anvĂ€nda CSS-klasser och kaskadering:
@property --theme {
syntax: '<custom-ident>';
inherits: true;
initial-value: light;
}
:root {
--theme: light;
}
body {
background-color: #fff;
color: #000;
}
body[data-theme="dark"] {
background-color: #333;
color: #fff;
}
/* JavaScript för att vÀxla temat */
/* document.body.setAttribute('data-theme', 'dark'); */
I detta reviderade exempel anvÀnder vi ett data-theme-attribut pÄ body-elementet för att styra temat. JavaScript (utkommenterad) skulle anvÀndas för att vÀxla attributet mellan `light` och `dark`. Detta Àr ett mer robust och standardmÀssigt tillvÀgagÄngssÀtt för teman med CSS-variabler.
Fördelar med att anvÀnda @property
Att anvÀnda @property ger flera fördelar:
- FörbÀttrad kodlÀsbarhet och underhÄllbarhet: Genom att uttryckligen definiera den förvÀntade typen av vÀrde för en anpassad egenskap gör du din kod mer förstÄelig och mindre benÀgen att innehÄlla fel.
- FörbÀttrade animeringsmöjligheter:
@propertymöjliggör smidiga övergÄngar och animeringar för anpassade egenskaper, vilket öppnar upp nya möjligheter för att skapa dynamiska och engagerande anvÀndargrÀnssnitt. - BÀttre prestanda: WebblÀsare kan optimera renderingen av element med hjÀlp av registrerade anpassade egenskaper, vilket leder till förbÀttrad prestanda.
- TypsÀkerhet: WebblÀsaren validerar att det tilldelade vÀrdet matchar den deklarerade syntaxen, vilket förhindrar ovÀntat beteende och gör felsökningen enklare. Detta Àr sÀrskilt anvÀndbart i stora projekt dÀr mÄnga utvecklare bidrar till koden.
- StandardvÀrden: Att sÀkerstÀlla att en anpassad egenskap alltid har ett giltigt vÀrde, Àven om det inte Àr uttryckligen instÀllt, förhindrar fel och förbÀttrar robustheten i din CSS.
WebblÀsarkompatibilitet
FrĂ„n och med sent 2023 har @property bra, men inte universellt, webblĂ€sarstöd. Det stöds i de flesta moderna webblĂ€sare, inklusive Chrome, Firefox, Safari och Edge. Ăldre webblĂ€sare kanske dock inte stöder det. Kontrollera alltid den senaste webblĂ€sarkompatibilitetsinformationen pĂ„ webbplatser som Can I use... innan du anvĂ€nder @property i produktion.
För att hantera Àldre webblÀsare kan du anvÀnda funktionsfrÄgor (@supports) för att tillhandahÄlla reservstilar:
@supports (--property: value) {
/* Stilar som anvÀnder @property */
}
@supports not (--property: value) {
/* Reservstilar för webblÀsare som inte stöder @property */
}
ErsÀtt --property och value med en faktisk anpassad egenskap och dess vÀrde.
NÀr ska du anvÀnda @property
ĂvervĂ€g att anvĂ€nda @property i följande scenarier:
- NÀr du behöver animera anpassade egenskaper: Detta Àr det primÀra anvÀndningsomrÄdet för
@property. Att registrera egenskapen med rÀtt syntax möjliggör smidiga animeringar. - NÀr du vill genomdriva typsÀkerhet för anpassade egenskaper: Om du vill sÀkerstÀlla att en anpassad egenskap alltid innehÄller ett vÀrde av en specifik typ, anvÀnd
@propertyför att registrera den. - NÀr du vill tillhandahÄlla ett standardvÀrde för en anpassad egenskap:
initial-value-deskriptorn lÄter dig ange ett reservvÀrde. - I stora projekt:
@propertyförbÀttrar kodunderhÄllbarheten och förhindrar fel, vilket gör det sÀrskilt fördelaktigt för stora projekt med mÄnga utvecklare. - NÀr du skapar ÄteranvÀndbara komponenter eller designsystem:
@propertykan hjÀlpa till att sÀkerstÀlla konsekvens och förutsÀgbarhet mellan dina komponenter.
Vanliga misstag att undvika
- Glömma
syntax-deskriptorn: Utansyntax-deskriptorn vet inte webblÀsaren den förvÀntade typen av vÀrde, och animeringar fungerar inte korrekt. - AnvÀnda fel
syntax-vÀrde: Att vÀlja fel syntax kan leda till ovÀntat beteende. Se till att vÀlja den syntax som korrekt Äterspeglar den förvÀntade typen av vÀrde. - Inte tillhandahÄlla ett
initial-value: Utan ett initialt vĂ€rde kan den anpassade egenskapen vara odefinierad, vilket leder till fel. Ange alltid ett vettigt standardvĂ€rde. - ĂveranvĂ€nda
*som syntax: Ăven om det Ă€r bekvĂ€mt, upphĂ€ver anvĂ€ndningen av*fördelarna med typkontroll och animering. AnvĂ€nd det bara nĂ€r du verkligen behöver tillĂ„ta vilken typ av vĂ€rde som helst. - Ignorera webblĂ€sarkompatibilitet: Kontrollera alltid webblĂ€sarkompatibilitet och tillhandahĂ„ll reservstilar för Ă€ldre webblĂ€sare.
@property och CSS Houdini
@property Àr en del av en större uppsÀttning API:er som kallas CSS Houdini. Houdini lÄter utvecklare utnyttja webblÀsarens renderingsmotor, vilket ger dem oövertrÀffad kontroll över stylingen och layoutprocessen. Andra Houdini-API:er inkluderar:
- Paint API: LÄter dig definiera anpassade bakgrundsbilder och ramar.
- Animation Worklet API: Ger ett sÀtt att skapa högpresterande animeringar som körs direkt i webblÀsarens kompositortrÄd.
- Layout API: LÄter dig definiera anpassade layoutalgoritmer.
- Parser API: Ger Ätkomst till webblÀsarens CSS-parser.
@property Àr ett relativt enkelt Houdini-API att lÀra sig, men det öppnar dörren till att utforska mer avancerade Houdini-funktioner.
Slutsats
@property Ă€r en kraftfull CSS at-regel som lĂ„ser upp avancerade funktioner för anpassade egenskaper. Genom att registrera anpassade egenskaper hos webblĂ€saren kan du genomdriva typsĂ€kerhet, möjliggöra smidiga animeringar och förbĂ€ttra den övergripande robustheten i din CSS-kod. Ăven om webblĂ€sarstödet inte Ă€r universellt, gör fördelarna med att anvĂ€nda @property, sĂ€rskilt i stora projekt och designsystem, det till ett vĂ€rdefullt verktyg för modern webbutveckling. Omfamna @property och ta dina CSS-kunskaper till nĂ€sta nivĂ„!